/**
 * @name axios 请求器
 * @author Conan
 * @version 1.0
 */

// todo
//  import axios from 'axios'

// todo 使用模块化编写时可以使用 import 导入
// import { removePendingRequest, addPendingRequest } from './cancelRepetitive'

// 业务code处理方法; todo 模块化时使用
// import { businessCodeDispose } from './businessCodeDispose'

// 业务code处理方法; todo 模块化时使用
// import { checkToken } from './checkToken'

// todo 用来给参数对象进行序列化转换;(使用在node相关的工程文件中时可直接 const qs = require('qs')
const qs = Qs;


// 初始化axios实例
const server = axios.create({
  // todo 这里的 baseURL 可以配置成全局变量进行获取
  baseURL: 'https://carepoch-server-dev.pnbay.com/carepoch-buyer-web',
  timeout: 5000,
	transformRequest: [function(data) {
		let ret = ''
		for (const it in data) {
			ret += encodeURIComponent(it) + '=' + encodeURIComponent(data[it]) + '&'
		}
		return ret
	}],
	headers: {
	  'Content-Type': 'application/x-www-form-urlencoded'
	}
})

// -----------------------------------------------------------------------请求拦截器 start
/**
 * 请求拦截器(发送请求之前拦截)
 */
server.interceptors.request.use(async function(config) {
	try {
		// todo 动态获取 token 值
		config.headers['you-are-token'] = 'token value';
		// 检查是否需要刷新token,并且刷新token
		await checkToken()
		
		// 检查是否重复请求模块代码
		// 检查是否存在重复请求，若存在则取消已发的请求
		removePendingRequest(config);
		// 把当前请求信息添加到pendingRequest对象中
		addPendingRequest(config, axios);
		return config;
	} catch(err) {
		console.error(`请求错误: url: ${config.url}; 错误信息: ${err}`)
		return config;
	}
}, function(error) {
  // 对请求错误做些什么
  return Promise.reject(error);
})
// -----------------------------------------------------------------------请求拦截器 end





// -----------------------------------------------------------------------请求响应拦截器 start
/**
 * 请求响应拦截器(发送请求成功并得到响应后拦截)
 */
 server.interceptors.response.use(function(response) {

  // 检查是否重复请求模块代码
  // 从pendingRequest对象中移除请求
  removePendingRequest(response.config);

  // 业务code处理方法
  return businessCodeDispose(res)

}, function(error) {
   // 从pendingRequest对象中移除请求
  removePendingRequest(error.config || {});
  
  // 重新发起请求方法
  return anewInitiate(error.config, server, error)
})
// -----------------------------------------------------------------------请求响应拦截器 end

// 自己定义个适配器，用来适配uniapp的语法; todo: 该方法是用于uniApp时使用的
// server.defaults.adapter = function(config) {
//   return new Promise((resolve, reject) => {
//       console.log(config)
//       var settle = require('axios/lib/core/settle');
//       var buildURL = require('axios/lib/helpers/buildURL');
//       uni.request({
//           method: config.method.toUpperCase(),
//           url: config.baseURL + buildURL(config.url, config.params, config.paramsSerializer),
//           header: config.headers,
//           data: config.data,
//           dataType: config.dataType,
//           responseType: config.responseType,
//           sslVerify: config.sslVerify,
//           complete: function complete(response) {
//               console.log("执行完成：",response)
//               response = {
//                   data: response.data,
//                   status: response.statusCode,
//                   errMsg: response.errMsg,
//                   header: response.header,
//                   config: config
//               };
//               settle(resolve, reject, response);
//           }
//       })
//   })
// }

// todo 如使用模块化项目中可以直接 export 输出
// export default server